// 数组扁平化就是将 [1, [2, [3]]] 这种多层的数组拍平成一层 [1, 2, 3]。使用 Array.prototype.flat 可以直接将多层数组拍平成一层：
function flatten (arr) {
  return arr.flat(2) // 拍平几层
}
console.log(flatten([1, [2, 3, [5, 6, 7, [8, 9, 10]]], 4]));

// ES5 实现：递归。
function flatten1 (arr) {
  // 递归 返回值就是这个数组的扁平后的值
  // 如果这个数组的项是数组 就递归调用扁平化函数处理这一项 返回是一个数组 调用concat方法将其穿插在一起
  // 如果不是数组 直接push进结果中
  let result = []
  for (let i = 0; i < arr.length; i++) {
    if (Array.isArray(arr[i])) {
      result.push(...flatten(arr[i]))
    } else {
      result.push(arr[i])
    }
  }
  return result
}
console.log('flatten1', flatten1([1, [2, 3, [5, 6, 7, [8, 9, 10]]], 4]));
// ES6 实现：
// function flatten2 (arr) {
//   // 如果数组里面的某一项是数组 就把这一项转换成不是数组插入原数组中
//   while (arr.some(item => Array.isArray(item))) {
//     arr = [].concat(...arr) // 将原数组结构调用concatkey消除掉一个[] 不断的循环 直至没有[]
//   }
//   return arr
// }
// console.log(flatten2([1, [2, 3, [5, 6, 7, [8, 9, 10]]], 4]));
// function flatten3 (arr) {
//   // let result = []
//   // for (let i of arr) {
//   //   if (i instanceof Array) {
//   //     // result = [...result, ...flatten3(i)]
//   //     result.push(...flatten3(i))
//   //   } else {
//   //     result.push(i)
//   //   }
//   // }
//   // return result
//   let result = []
//   for (let item of arr) {
//     if (item instanceof Array) {
//       result.push(...flatten3(item))
//     } else {
//       result.push(item)
//     }
//   }
//   return result
// }
// console.log('flatten3', flatten3([1, [2, 3, [5, 6, 7, [8, 9, 10]]], 4]));
// function flatten4 (arr) {
//   // while (arr.some((item) => item instanceof Array)) {
//   //   arr = [].concat(...arr)
//   // }
//   // return arr
//   while (arr.some((item) => item instanceof Array)) {
//     // arr = [].concat(arr)

//     // console.log(arr);
//   }
//   return arr
// }
// console.log(flatten4([1, [2, 3, [5, 6, 7, [8, 9, 10]]], 4]));
// console.log([].concat([1, 2, 3]));
// console.log([].concat(1, 2, 3));